using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


using System.IO;
using System.Threading;
using System.Configuration;
using System.Globalization;
using System.Text.RegularExpressions;



namespace Aplikace_JK
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private static string RxString = "xxxxxxx";     // deklarace proměnných 
        private static int pocetPokusu = 0;
        private static int pocetNactenych = 0;
        float RXTemp;
        

        private void Form1_Load(object sender, EventArgs e)
        {
                                                                 //spuštění timerů
            timer1.Start();
            label2.Text = DateTime.Now.ToLongTimeString();
            label3.Text = DateTime.Now.ToLongDateString();
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
          
            try
            {
                if (!serialPortRead.IsOpen)         //kontrola zda je port otevřen
                {

                    serialPortRead.Open();          //  otevření portu

                    button1.Enabled = false;

                }
                else { }


            }


            catch { }

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
           
        }

                                                                                    // v případě neočekávaného vypnutí aplikace se seriový port uzavře
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            serialPortRead.Close();
        }

                                                                                                                 // zpracování příchozích dat
        private void serialPortRead_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            serialPortRead.ReadTimeout = 1500;  //časovač na 1,5s
            serialPortRead.NewLine = "\x0d";
            
            try
            {
                
                RxString = serialPortRead.ReadLine();            
                this.Invoke(new EventHandler(DisplayText));
              
            }
                                                // pokud nepřišel znak 0d do 1,5s, zahodí se buffer, aktualizují se statistiky
            catch (TimeoutException)
            {
                
                serialPortRead.DiscardInBuffer();
                this.Invoke(new EventHandler(Aktualizuj));
                return;
            } 
            
         
         
        }

                                                                // zobrazení přijaté hodnoty 
        private void DisplayText(object s, EventArgs e) 
        {

         try
            {
                    if (Regex.IsMatch(RxString, @"^[+/-]\d{3}[.]\d{1}[C]"))     //kontrola zda byla data přijata ve správném formátu 
                    {
                    pocetNactenych++;
                    pocetPokusu++; 
                    this.Invoke(new EventHandler(Aktualizuj));
                    float.TryParse(RxString.Substring(0, 6), System.Globalization.NumberStyles.Float, CultureInfo.GetCultureInfo("en-US").NumberFormat, out RXTemp);        // úprava a zobrazení přijatých dat z teploměru
                        RxString = RXTemp.ToString(CultureInfo.GetCultureInfo("en-US").NumberFormat);
                        richTextBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd  HH:mm:ss: ") + RxString+" °C" + Environment.NewLine);

                    }
                    else {
                    pocetPokusu++;
                    this.Invoke(new EventHandler(Aktualizuj));
                    richTextBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd  HH:mm:ss: ") + " Chyba - poškozeni přijatého řetězce" + Environment.NewLine);        // v případě přijetí vadných dat, výpis chybové hlášky s časem

                    }
         
            }

            catch (System.FormatException)
            {  }
            
        }

                                                        // funkce pro aktualizaci zobrazení stavu přenosu ( počet přijatých nepoškozených dat / celkový počet přijatých dat)
        private void Aktualizuj(object s, EventArgs e)
        {
            label5.Text= "  OK  / Celkem\n" + pocetNactenych.ToString()+"/"+pocetPokusu.ToString();         //zobrazení statistiky správně přijatých hodnot
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label2.Text = DateTime.Now.ToLongTimeString();      // čas a datum
            timer1.Start();
        }

        private void button3_Click(object sender, EventArgs e)     
        {
            richTextBox1.Clear();            //smazání dat z richTextBoxu
            pocetPokusu = 0;                // vymazání statistik správně přijatých hodnot
            pocetNactenych = 0;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPortRead.Close();                             // uzavření portu
            button1.Enabled = true;
        }

        private void button6_Click(object sender, EventArgs e)
        {
            label4.Text = comboBox1.SelectedItem.ToString();                // potvrzující zobrazení vybraného komunikačního portu
            serialPortRead.PortName = comboBox1.SelectedItem.ToString() ;
            
        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                richTextBox1.LoadFile(@"C:\aplikace_PLC\DATA.txt", RichTextBoxStreamType.PlainText); //// načtení dat ze souboru uloženého na C:\aplikace_PLC\DATA.txt
            }

            catch (TimeoutException)
            {

            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                richTextBox1.SaveFile(@"C:\aplikace_PLC\DATA.txt", RichTextBoxStreamType.PlainText);   // uložení dat do souboru uloženého na C:\aplikace_PLC\DATA.txt
            }

            catch (TimeoutException)
            {

            }
        }
    }
}
